#!/bin/bash

#-----------------------------------------------------------------------
# 一个用于交互式选择、下载并运行指定版本 Solr Docker 容器的脚本。
# 功能:
# 1. 检查 Docker 是否已安装并正在运行。
# 2. 允许用户从菜单选择 Solr 版本 (例如 9.x, 8.11.x, 8.8.2)。
# 3. 允许用户自定义容器名称、主机端口和 Solr 核心(Core)名称。
# 4. 自动在指定目录 (/home/solr_data) 创建并挂载数据卷，并修复目录权限。
# 5. 自动拉取官方 Solr 镜像并启动容器。
# bash <(curl -s -L https://gitee.com/securitypass/auto-scirpt/raw/master/docker/start_solr.sh)
#-----------------------------------------------------------------------

# 设置颜色变量，用于美化输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色


# 1. --- 安装 Docker (Debian/Ubuntu) ---
install_docker_debian() {
    echo -e "${YELLOW}正在为 Debian/Ubuntu 系统安装 Docker... 这可能需要几分钟。${NC}"
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker
    sudo systemctl enable docker
    echo -e "${GREEN}Docker 安装完成并已启动。${NC}"
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}Docker 安装后仍然找不到命令, 请检查安装过程中的错误。${NC}"
        exit 1
    fi
}

# --- 安装 Docker (CentOS/RHEL/Fedora) ---
install_docker_centos() {
    echo -e "${YELLOW}正在为 CentOS/RHEL/Fedora 系统安装 Docker... 这可能需要几分钟。${NC}"
    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install -y docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker
    sudo systemctl enable docker
    echo -e "${GREEN}Docker 安装完成并已启动。${NC}"
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}Docker 安装后仍然找不到命令, 请检查安装过程中的错误。${NC}"
        exit 1
    fi
}


# --- 自动配置 Docker 镜像加速器 (仅限Linux) ---
configure_docker_mirror() {
    OS="$(uname -s)"
    if [ "${OS}" != "Linux" ]; then
        echo -e "${YELLOW}检测到非Linux系统, 请手动为 Docker Desktop 配置镜像加速器以提高下载速度。${NC}"
        echo "操作路径: Settings -> Docker Engine -> 添加 \"registry-mirrors\": [\"https://1.abclist.eu.org\"]"
        echo "----------------------------------------"
        return
    fi

    DOCKER_CONFIG_FILE="/etc/docker/daemon.json"
    MIRROR_URL="https://1.abclist.eu.org" # 使用一个稳定的公共加速器

    echo "正在检查 Docker 镜像加速器配置..."
    if [ -f "$DOCKER_CONFIG_FILE" ] && grep -q "registry-mirrors" "$DOCKER_CONFIG_FILE"; then
        echo -e "${GREEN}检测到已配置镜像加速器, 无需修改。${NC}"
    else
        echo -e "${YELLOW}未检测到镜像加速器, 准备自动配置...${NC}"
        echo "此操作需要 sudo 权限来修改 '$DOCKER_CONFIG_FILE' 并重启 Docker 服务。"

        # 创建或修改配置文件
        sudo mkdir -p /etc/docker
        sudo bash -c "cat > $DOCKER_CONFIG_FILE" <<EOF
{
  "registry-mirrors": ["$MIRROR_URL"]
}
EOF

        if [ $? -eq 0 ]; then
            echo "配置文件写入成功。"
            echo "正在尝试重启 Docker 服务..."
            sudo systemctl daemon-reload && sudo systemctl restart docker
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}Docker 服务重启成功, 加速器已生效。${NC}"
            else
                echo -e "${RED}Docker 服务重启失败, 请手动执行 'sudo systemctl restart docker'。${NC}"
                exit 1
            fi
        else
            echo -e "${RED}写入配置文件失败, 请检查权限。${NC}"
            exit 1
        fi
    fi
    echo "----------------------------------------"
}


# ---  检查 Docker 环境 ---
check_docker() {
    echo "正在检查 Docker 环境..."
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}错误: 未检测到 Docker 命令。${NC}"
        read -p "是否尝试自动安装 Docker? (y/n): " install_choice
        if [[ "$install_choice" == "y" || "$install_choice" == "Y" ]]; then
            if [ -f /etc/os-release ]; then
                . /etc/os-release
                if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then
                    install_docker_debian
                elif [[ "$ID" == "centos" || "$ID" == "rhel" || "$ID" == "fedora" || "$ID" == "rocky" ]]; then
                    install_docker_centos
                else
                    echo -e "${YELLOW}抱歉, 暂不支持您的 Linux 发行版 (${ID}) 的自动安装。${NC}"
                    echo "请参考官方文档手动安装: https://docs.docker.com/engine/install/"
                    exit 1
                fi
            else
                echo -e "${YELLOW}无法确定 Linux 发行版, 无法自动安装。${NC}"
                echo "请参考官方文档手动安装: https://docs.docker.com/engine/install/"
                exit 1
            fi
        else
            echo "用户取消安装。脚本退出。"
            exit 1
        fi
    fi

    if ! docker info &> /dev/null; then
        echo -e "${RED}错误: Docker 服务未运行。${NC}"
        echo "请尝试使用 'sudo systemctl start docker' 启动服务后再运行此脚本。"
        exit 1
    fi
    echo -e "${GREEN}Docker 环境正常。${NC}"
    echo "----------------------------------------"
    # 自动配置镜像加速器
    configure_docker_mirror
}





# --- 2. 版本选择 ---
select_version() {
    echo -e "${YELLOW}请选择您想安装的 Solr 版本:${NC}"
    echo "1) Solr 8.8.2"
    echo "2) Solr 8.11.4(推荐)"
    echo "3) Solr 9.9.0"
    echo "4) Solr 9.8.1"
    read -p "请输入选项数字 [1-4, 默认 1]: " version_choice

    case $version_choice in
        1)
            IMAGE_NAME="solr:8.8.2"
            ;;
        2)
            IMAGE_NAME="solr:8.11.4"
            ;;
        3)
            IMAGE_NAME="solr:9.9.0"
            ;;
        4)  
            IMAGE_NAME="solr:9.8.1"
            ;;      
    esac

    echo -e "您选择了镜像: ${GREEN}${IMAGE_NAME}${NC}"
    echo "----------------------------------------"
}

# --- 3. 自定义名称、端口和核心 ---
get_user_input() {
    # 获取容器名称
    read -p "请输入容器的名称 (例如: solr): " CONTAINER_NAME
    if [ -z "$CONTAINER_NAME" ]; then
        echo -e "${RED}错误: 容器名称不能为空。脚本退出。${NC}"
        exit 1
    fi

    # 获取主机端口
    read -p "请输入要映射到主机上的端口 (Solr 默认 8983): " HOST_PORT
    if ! [[ "$HOST_PORT" =~ ^[0-9]+$ ]] || [ "$HOST_PORT" -lt 1 ] || [ "$HOST_PORT" -gt 65535 ]; then
        echo -e "${YELLOW}输入无效, 将使用默认端口 8983。${NC}"
        HOST_PORT=8983
    fi

    # 获取 Solr Core 名称
    #read -p "请输入要创建的 Solr 核心(Core)名称 (以免检索出错，solr请使用: biblio): " CORE_NAME
    #if [ -z "$CORE_NAME" ]; then
    #    echo -e "${RED}错误: 核心名称不能为空。脚本退出。${NC}"
    #    exit 1
    #fi

    # 获取数据目录路径
    read -p "请输入数据存储目录的路径 (默认: /home/solr_data): " DATA_DIR
    if [ -z "$DATA_DIR" ]; then
        DATA_DIR="/home/solr_data"
        echo -e "${YELLOW}使用默认数据目录: ${DATA_DIR}${NC}"
    fi

    # 获取Solr JVM内存参数
    read -p "请输入Solr JVM内存参数(默认2g): " SOLR_JAVA_MEM
    if [ -z "$SOLR_JAVA_MEM" ]; then
        SOLR_JAVA_MEM="2g"
        echo -e "${YELLOW}使用默认JVM内存参数: ${SOLR_JAVA_MEM}${NC}"
    fi

    echo "----------------------------------------"
}

# --- 4. 准备本地目录 ---
prepare_directory() {
    # DATA_DIR 由用户输入

    echo -e "${YELLOW}将在主机上创建并挂载以下数据卷:${NC}"
    echo " - 主机路径: ${DATA_DIR}"
    echo " - 容器路径: /var/solr"
    echo "此目录将用于持久化存储所有 Solr 核心的数据。"

    # 创建目录
    sudo mkdir -p ${DATA_DIR}
    
    # [关键修复] 修改目录所有者以匹配容器内的solr用户(UID:8983, GID:8983)
    echo "正在更新目录权限以供 Solr 容器使用..."
    sudo chown -R 8983:8983 ${DATA_DIR}

    # 自动准备 server/solr 目录并下载 biblio.zip
    CONFIG_DIR="${DATA_DIR}/server/solr"
    sudo mkdir -p "${CONFIG_DIR}"
    echo "正在下载 biblio.zip 到 ${CONFIG_DIR}..."
    wget -O "${CONFIG_DIR}/biblio.zip" https://gitee.com/securitypass/auto-scirpt/raw/master/docker/biblio.zip
    # 检查并创建 ${DATA_DIR}/data 目录
    if [ ! -d "${DATA_DIR}/data" ]; then
        echo "${DATA_DIR}/data 目录不存在，正在创建..."
        sudo mkdir -p "${DATA_DIR}/data"
    fi
    if [ $? -eq 0 ]; then
        echo "biblio.zip 下载成功。"
        # 解压到 ${DATA_DIR}/data 目录
        unzip -o "${CONFIG_DIR}/biblio.zip" -d "${DATA_DIR}/data/"
        # 如果解压后有多余的 biblio 目录，则移动内容到 ${DATA_DIR}/data 并删除多余目录
        if [ -d "${DATA_DIR}/data/biblio" ]; then
            mv "${DATA_DIR}/data/biblio/"* "${DATA_DIR}/data/"
            rm -rf "${DATA_DIR}/data/biblio"
        fi
        echo "配置文件已自动解压到: ${DATA_DIR}/data"
    else
        echo -e "${RED}biblio.zip 下载失败，请检查网络。${NC}"
    fi
    
    echo "本地数据目录已准备就绪。"
    echo "----------------------------------------"
}

# --- 5. 启动容器 ---
start_container() {
    # DATA_DIR 由用户输入

    echo -e "${YELLOW}准备启动 Solr 容器...${NC}"

    # 检查同名容器是否已存在，如果存在则停止并删除
    if [ $(docker ps -a -f name=^/${CONTAINER_NAME}$ | grep -w ${CONTAINER_NAME} | wc -l) -gt 0 ]; then
        echo "发现已存在的同名容器 '${CONTAINER_NAME}'，正在停止并删除..."
        docker stop ${CONTAINER_NAME} > /dev/null
        docker rm ${CONTAINER_NAME} > /dev/null
        echo "旧容器 '${CONTAINER_NAME}' 已被删除。"
    fi
    
    # 拉取镜像
    echo "正在拉取镜像: ${IMAGE_NAME}..."
    docker pull 1.abclist.eu.org/${IMAGE_NAME}
    if [ $? -ne 0 ]; then
        echo -e "${RED}✘ 镜像拉取失败! 请检查网络或镜像名称。${NC}"
        exit 1
    fi
    echo -e "${GREEN}镜像拉取成功。${NC}"
    echo "----------------------------------------"

    # 运行容器
    echo "正在以名称 '${CONTAINER_NAME}' 启动容器并创建核心 ..."
    docker run -d \
        --name ${CONTAINER_NAME} \
        -p ${HOST_PORT}:8983 \
        -v "${DATA_DIR}":/var/solr \
        -v "${CONFIG_DIR}":/opt/solr/server/solr/biblio \
        -e LANG=zh_CN.UTF-8 \
        -e LANGUAGE=zh_CN:zh \
        -e SOLR_JAVA_MEM="-Xms${SOLR_JAVA_MEM} -Xmx${SOLR_JAVA_MEM}" \
        --restart always \
        ${IMAGE_NAME} \
        solr-create -c biblio -d /opt/solr/server/solr/biblio

    # 检查容器是否成功运行
    sleep 5 # 等待几秒钟让容器有时间启动
    if [ $(docker ps -f name=^/${CONTAINER_NAME}$ | grep -w ${CONTAINER_NAME} | wc -l) -gt 0 ]; then
        echo -e "${GREEN}✔ Solr 部署成功!${NC}"
        echo -e "  - ${YELLOW}容器名称:${NC} ${CONTAINER_NAME}"
        echo -e "  - ${YELLOW}Admin UI 地址:${NC} http://localhost:${HOST_PORT}"
        #echo -e "  - ${YELLOW}创建的核心:${NC} ${CORE_NAME}"
        echo -e "  - ${YELLOW}数据存储路径:${NC} ${DATA_DIR}"
    else
        echo -e "${RED}✘ 部署失败! 请通过 'docker logs ${CONTAINER_NAME}' 查看错误日志。${NC}"
    fi

    echo "----------------------------------------"
}

# --- 主执行流程 ---
main() {
    check_docker
    select_version
    get_user_input
    prepare_directory
    start_container
}

# 调用主函数
main
